package test;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.TemplateConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;

/**
 * mybatis plus代码生成器
 */
public class MybatisPlusCodeGenerator {

    private String outputDir = "./target/generator";
    private String moduleName = "hms";
    private String parentPackageName = "com.dxy";
    private String dbUrl = "jdbc:mysql://localhost:3306/hms?serverTimezone=Asia/Shanghai";
    private String dbUsername = "root";
    private String dbPassword = "root";
    private String author = "dxy";


    public static void main(String[] args) {

        // 表和前缀
        String[] tableList = {"hms_dict","hms_room","hms_room_type"};
        String[] prefixList = {"hms"};

        // 生成代码
        MybatisPlusCodeGenerator generator = new MybatisPlusCodeGenerator();
        generator.execute(tableList, prefixList);
    }

    private void execute(String[] tableNames, String[] tablePrefixs) {

        // 1. 数据源
        DataSourceConfig dsConfig =
                new DataSourceConfig.Builder(dbUrl, dbUsername, dbPassword).build();

        // 2. 全局配置
        GlobalConfig globalConfig = new GlobalConfig.Builder()
                .author(author) // 作者
                .outputDir(outputDir) // 输出路径
                .enableSwagger() // 开启 swagger 模式 默认值:false
                .disableOpenDir() // 禁止打开输出目录 默认值:true
                .dateType(DateType.TIME_PACK) // 时间类型字段对应策略
                .commentDate("yyyy-MM-dd") // 注释日期格式
                .build();

        // 3. 包配置
        PackageConfig packageConfig = new PackageConfig.Builder()
                .parent(parentPackageName) // 父包名
                .moduleName(moduleName) // 模块名
                .entity("entity") // 实体类包名
                .mapper("mapper") // mapper接口包名
                .service("service") // service接口报名
                .serviceImpl("service.impl") // service实现类报名
                .controller("controller") // controller类包名
                .xml("xml") // mybatis xml文件路径名
                .build();

        // 4. 模板配置
        TemplateConfig templateConfig = new TemplateConfig.Builder()
                .xml(null) // mybatis xml模板位置，设置为 null，表示不生成 XML 文件
                // 其他模板
                .controller("templates/customcontroller.java")
                .service("templates/customservice.java")
                .serviceImpl("templates/customserviceimpl.java")
                .build();


        // 5. 策略配置
        StrategyConfig strategyConfig = new StrategyConfig.Builder()
                // 生成代码的表名
                .addInclude(tableNames)

                // 去除的表前缀
                .addTablePrefix(tablePrefixs)

                //controller 策略配置
                .controllerBuilder()
                .formatFileName("%sController")
                .enableRestStyle() // 开启RestController注解

                // service 策略配置
                .serviceBuilder()
                .formatServiceFileName("%sService")
                .formatServiceImplFileName("%sServiceImpl")

                // mapper 策略配置
                .mapperBuilder()
                .formatMapperFileName("%sMapper")
                .enableMapperAnnotation()//@mapper注解开启
                .formatXmlFileName("%sMapper")

                // entity 策略配置
                .entityBuilder()
                .idType(IdType.ASSIGN_UUID)//主键策略
                .disableSerialVersionUID()
                .addTableFills(new Column("create_time", FieldFill.INSERT)) // 自动填充配置
                .addTableFills(new Column("create_user_id", FieldFill.INSERT))
                .addTableFills(new Column("create_user_name", FieldFill.INSERT))
                .addTableFills(new Column("update_time", FieldFill.INSERT_UPDATE))
                .addTableFills(new Column("update_user_id", FieldFill.INSERT_UPDATE))
                .addTableFills(new Column("update_user_name", FieldFill.INSERT_UPDATE))
                .enableLombok() //开启lombok
                .enableChainModel() // 添加@Accessors(chain = true)
                .logicDeleteColumnName("is_deleted")// 说明逻辑删除是哪个字段
                // .enableTableFieldAnnotation()// 属性加上注解说明

                // 构建
                .build();


        // 代码生成器
        AutoGenerator generator = new AutoGenerator(dsConfig);
        generator.global(globalConfig);
        generator.packageInfo(packageConfig);
        generator.template(templateConfig);
        generator.strategy(strategyConfig);

        // 生成代码（使用Freemarker引擎模板，默认的是Velocity引擎模板）
        generator.execute(new FreemarkerTemplateEngine());

    }
}
